package de.gof.ppstool.kundenauftragsverwaltung;

import java.io.Serializable;
import java.util.List;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import static de.gof.ppstool.util.LogUtil.begin;
import static de.gof.ppstool.util.LogUtil.end;
import static de.gof.ppstool.util.LogUtil.logBeginTrans;
import static de.gof.ppstool.util.LogUtil.logCommit;
import static de.gof.ppstool.util.LogUtil.logRollback;
import de.gof.ppstool.kundenauftragsverwaltung.db.IKundenauftragsverwaltungDAO;
import de.gof.ppstool.kundenauftragsverwaltung.db.Kundenauftrag;
import de.gof.ppstool.kundenauftragsverwaltung.db.KundenauftragDeletedException;
import de.gof.ppstool.kundenauftragsverwaltung.db.KundenauftragNotFoundException;
import de.gof.ppstool.kundenauftragsverwaltung.db.Prognose;
import de.gof.ppstool.kundenauftragsverwaltung.db.PrognoseNotFoundException;
import de.gof.ppstool.util.GofUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service(IKundenauftragsverwaltung.NAME)
@Transactional
public class Kundenauftragsverwaltung implements IKundenauftragsverwaltung,
		Serializable {
	private static final long serialVersionUID = 3609521276397430542L;
	private static final Log LOG = LogFactory.getLog(GofUtil.class);
	private static final boolean DEBUG = LOG.isDebugEnabled();
	private static final boolean TRACE = LOG.isDebugEnabled();
	@SuppressWarnings("unused")
	@PersistenceContext
	private EntityManager em;
	@Autowired
	private IKundenauftragsverwaltungDAO dao;

	// = GofUtil.getKundenauftragsverwaltungDao();
	public Kundenauftragsverwaltung() {
		super();
	}

	/**
	 * { @inheritDoc}
	 */
	//	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
	public Kundenauftrag createKundenauftrag(Kundenauftrag kundenauftrag) {
		dao.createKundenauftrag(kundenauftrag);
		return kundenauftrag;
	}

	/**
	 * { @inheritDoc}
	 */
	public void deleteKundenauftrag(Kundenauftrag kundenauftrag) {
		if (DEBUG)
			begin(LOG, kundenauftrag);

		if (kundenauftrag == null) {
			if (DEBUG)
				end(LOG, kundenauftrag);

			return;
		}

		if (TRACE)
			logBeginTrans(LOG);

		dao.deleteKundenauftrag(kundenauftrag);
		if (TRACE)
			logCommit(LOG);

		if (DEBUG)
			end(LOG);

	}

	/**
	 * { @inheritDoc}
	 */
	public Kundenauftrag editKundenauftrag(Kundenauftrag kundenauftrag)
			throws KundenauftragDeletedException {
		if (kundenauftrag == null) {
			return null;
		}

		if (TRACE)
			logBeginTrans(LOG);

		kundenauftrag = dao.editKundenauftrag(kundenauftrag);
		if (TRACE)
			logCommit(LOG);

		return kundenauftrag;
	}

	/**
	 * { @inheritDoc}
	 */
	public Kundenauftrag findKundenauftrag(Long kundenauftragId)
			throws KundenauftragNotFoundException {
		if (DEBUG)
			begin(LOG, kundenauftragId);

		if (TRACE)
			logBeginTrans(LOG);

		Kundenauftrag kundenauftrag = null;
		try {
			kundenauftrag = dao.findKundenauftrag(kundenauftragId);
		} catch (KundenauftragNotFoundException e) {
			if (TRACE)
				logCommit(LOG);

			if (DEBUG)
				end(LOG, e.getMessage());

			throw e;
		}

		if (TRACE)
			logCommit(LOG);

		if (DEBUG)
			end(LOG, kundenauftrag);

		return kundenauftrag;
	}

	public List<Kundenauftrag> findeAlleKundenauftraege()
			throws KundenauftragNotFoundException {
		if (DEBUG)
			begin(LOG);

		if (TRACE)
			logBeginTrans(LOG);

		List<Kundenauftrag> kundenauftraege = null;
		try {
			kundenauftraege = dao.findeAlleKundenauftraege();
		} catch (KundenauftragNotFoundException e) {
			//trans.rollback(); //TODO
			if (TRACE)
				logRollback(LOG);

			if (DEBUG)
				end(LOG, e.getMessage());

			throw e;
		}

		if (TRACE)
			logCommit(LOG);

		if (DEBUG)
			end(LOG);

		return kundenauftraege;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
	public Prognose createPrognose(Prognose prognose) {
		dao.createPrognose(prognose);
		return prognose;
	}

	/**
	 * { @inheritDoc}
	 */
	public void deletePrognose(Prognose prognose) {
		if (DEBUG)
			begin(LOG, prognose);

		if (prognose == null) {
			if (DEBUG)
				end(LOG, prognose);

			return;
		}

		if (TRACE)
			logBeginTrans(LOG);

		dao.deletePrognose(prognose);
		if (TRACE)
			logCommit(LOG);

		if (DEBUG)
			end(LOG);

	}

	/**
	 * { @inheritDoc}
	 */
	public Prognose findPrognose(Long prognoseID)
			throws PrognoseNotFoundException {
		if (DEBUG)
			begin(LOG, prognoseID);

		if (TRACE)
			logBeginTrans(LOG);

		Prognose prognose = null;
		try {
			prognose = dao.findPrognose(prognoseID);
		} catch (PrognoseNotFoundException e) {
			if (TRACE)
				logCommit(LOG);

			if (DEBUG)
				end(LOG, e.getMessage());

			throw e;
		}

		if (TRACE)
			logCommit(LOG);

		if (DEBUG)
			end(LOG, prognose);

		return prognose;
	}

	/**
	 * { @inheritDoc}
	 */
	@Override
	public List<Prognose> findAllPrognose() {
		if (DEBUG)
			begin(LOG);

		if (TRACE)
			logBeginTrans(LOG);

		List<Prognose> prognose = null;
		prognose = dao.findAllPrognose();
		if (TRACE)
			logCommit(LOG);

		if (DEBUG)
			end(LOG);

		return prognose;
	}

	/**
	 * { @inheritDoc}
	 */
	public Prognose editPrognose(Prognose prognose)
			throws PrognoseNotFoundException {
		if (prognose == null) {
			return null;
		}

		if (TRACE)
			logBeginTrans(LOG);

		prognose = dao.editPrognose(prognose);
		if (TRACE)
			logCommit(LOG);

		return prognose;
	}

	/**
	 * { @inheritDoc}
	 */
	public Kundenauftrag findeKundenauftragNachBemerkung(String bemerkung)
			throws KundenauftragNotFoundException {
		Kundenauftrag kundenauftrag = null;
		kundenauftrag = dao.findeKundenauftragNachBemerkung(bemerkung);
		return kundenauftrag;
	}

	/**
	 * { @inheritDoc}
	 */
	public Prognose findePrognoseNachFahrradartUndPeriode(String fahrradart,
			String periode) throws PrognoseNotFoundException {
		Prognose prognose = null;
		prognose = dao.findePrognoseNachFahrradartUndPeriode(fahrradart,
				periode);
		return prognose;
	}

}
